package com.zhentao.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zhentao.dto.ParamRuleDTO;
import com.zhentao.dto.ParamRuleQueryDTO;
import com.zhentao.dto.RuleExecuteRequestDTO;
import com.zhentao.pojo.ParamRule;
import com.zhentao.vo.ParamRuleVO;
import com.zhentao.vo.RuleExecuteResultVO;

import java.util.List;

/**
* @author hp
* @description 针对表【param_rule(参数规则表：定义参数的计算规则和业务逻辑)】的数据库操作Service
* @createDate 2025-08-28 08:36:25
*/
public interface ParamRuleService extends IService<ParamRule> {
    
    /**
     * 🔍 分页查询规则列表
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    Page<ParamRuleVO> queryRules(ParamRuleQueryDTO queryDTO);
    
    /**
     * 📋 获取规则详情
     * @param id 规则ID
     * @return 规则详情
     */
    ParamRuleVO getRuleDetail(Long id);
    
    /**
     * 📋 根据编码获取规则详情
     * @param ruleCode 规则编码
     * @return 规则详情
     */
    ParamRuleVO getRuleDetailByCode(String ruleCode);
    
    /**
     * ➕ 创建规则
     * @param dto 规则信息
     * @return 是否创建成功
     */
    boolean createRule(ParamRuleDTO dto);
    
    /**
     * ✏️ 更新规则
     * @param id 规则ID
     * @param dto 更新信息
     * @return 是否更新成功
     */
    boolean updateRule(Long id, ParamRuleDTO dto);
    
    /**
     * 🗑️ 删除规则
     * @param id 规则ID
     * @return 是否删除成功
     */
    boolean deleteRule(Long id);
    
    /**
     * 🔄 切换规则状态
     * @param id 规则ID
     * @param status 目标状态：1-启用，0-禁用
     * @return 是否切换成功
     */
    boolean toggleRuleStatus(Long id, Integer status);
    
    /**
     * ✅ 检查规则编码是否可用
     * @param ruleCode 规则编码
     * @param excludeId 排除的ID（用于更新时检查）
     * @return 是否可用
     */
    boolean isRuleCodeAvailable(String ruleCode, Long excludeId);
    
    /**
     * 🧪 测试规则执行
     * @param id 规则ID
     * @param inputData 测试输入数据
     * @return 执行结果
     */
    RuleExecuteResultVO testRule(Long id, java.util.Map<String, Object> inputData);
    
    /**
     * 🧪 测试规则语法
     * @param ruleContent 规则内容
     * @param engineType 引擎类型
     * @return 测试结果，null表示语法正确
     */
    String testRuleSyntax(String ruleContent, String engineType);
    
    /**
     * 🚀 执行规则
     * @param request 执行请求
     * @return 执行结果
     */
    RuleExecuteResultVO executeRule(RuleExecuteRequestDTO request);
    
    /**
     * 🚀 批量执行规则
     * @param ruleCodes 规则编码列表
     * @param request 执行请求
     * @return 执行结果列表
     */
    List<RuleExecuteResultVO> executeRules(List<String> ruleCodes, RuleExecuteRequestDTO request);
    
    /**
     * 📊 获取规则执行统计
     * @param ruleCode 规则编码
     * @param days 统计天数
     * @return 统计信息
     */
    java.util.Map<String, Object> getRuleExecutionStats(String ruleCode, Integer days);
    
    /**
     * 🗂️ 根据类型获取规则列表
     * @param ruleType 规则类型
     * @param status 状态（可选）
     * @return 规则列表
     */
    List<ParamRuleVO> getRulesByType(String ruleType, Integer status);
    
    /**
     * 🏷️ 根据标签获取规则列表
     * @param tag 标签
     * @param status 状态（可选）
     * @return 规则列表
     */
    List<ParamRuleVO> getRulesByTag(String tag, Integer status);
    
    /**
     * 🧹 清除规则执行缓存
     * @param ruleCode 规则编码，null表示清除所有缓存
     */
    void clearRuleCache(String ruleCode);
}
